//%%CONSTANTS

     /* tipo tabela de simbolos */

     #define INTEIRO 1
     #define LOGICO 2
     #define CARACTERE 3
     #define ROTULO 4

     /*  classe tabela de simbolos */

     #define NAO_DECL 0
     #define VARIAVEL 1
     #define PAR 3
     #define PROC 4
     #define NMAX 29
     #define MAX 1000
     #define ALPHA1 9
     #define NPC 10
     #define IDTAM 15       /* no. caracteres significativos ident */
                    /* a posicao 0 de ident nao contem nada.*/

//%%TYPES

     typedef char alfa[IDTAM+1];
     typedef char alfa1[ALPHA1+1];

     typedef struct {   alfa nome;
                int classe;
                int tipotam;
                int endoff;
                int nivel;
                int col;
              } tscampos;

//%%VARIABLES

     /* tabela de simbolos */

     int nivel,l;
     tscampos ts[MAX+1];
     int thash[91];
     int escopo[NMAX+1];

//%%PROCEDURES

     int HASH(alfa simb)
     {
       int i,h;

       
       h = 0;
       i = 0;
       while ( (simb[i] != '\0') && (i < IDTAM))
       {
          h = h + simb[i];
          i = i + 1;

       }
       return h % 91;
     }  /*HASH*/


     int INSTALA(alfa simb)
     {
       int n,k;

       n = HASH(simb);
       k = thash[n];
       while (k >= escopo[nivel])
       {
         if (strcmp(simb,ts[k].nome)==0)
         {
           return k;
         }
         else k = ts[k].col;
       }
       if (l == MAX + 1)
       {
         return l;
       }
       strcpy(ts[l].nome,simb);
       ts[l].nivel = nivel;
       ts[l].classe = NAO_DECL;
       ts[l].col = thash[n];
       thash[n] = l;
       l++;
       return l-1;
     } /* INSTALA*/


     int PROCURAID(alfa simb)
     {
       int n,k;
        
       n = HASH(simb);
       k = thash[n];
       while (k != 0)
       {
         if (strcmp(simb,ts[k].nome) == 0) return k;
         k = ts[k].col;
       }
       return INSTALA(simb);
     } /* PROCURAID */

     void ABLOCO(void)
     {
       nivel++;
       escopo[nivel] = l;
     } /*ABLOCO*/

     void FBLOCO(void)
     {
       int s,b,k;

       s = l;
       b = escopo[nivel];
       while (s > b)                  /* desfaz hash */
       {
         s--;
         k = HASH(ts[s].nome);
         thash[k] = ts[s].col;
       }
       nivel--;
     } /*FBLOCO*/

     void TAMANHO(int proced,int addr)
     {
       ts[proced].endoff = addr;
     } /* TAMANHO */

     void DECLARA(int k,int class,int tipot,int offset)
     {
       ts[k].classe = class;
       ts[k].tipotam = tipot;
       ts[k].endoff = offset;
     } /* DECLARA */
     int FOIDECLARADO(int k)
     {
       if (ts[k].classe != NAO_DECL)
         return 1;                  /* FOIDECLARADO = true  */
       else return 0;                   /* FOIDECLARADO = false */
     } /*FOIDECLARADO*/

